//1.封装全局axios，只返回（二次封装）的数据格式 2.响应错误，统一异常处理
/**
 * function(res){ } 等价于 (res)=>{}
 */
import axios from "axios";
import handleError from "./handleException";
//引入配置好的baseUrl
import '../config/env'

//ES6中可定义class
class HttpRequest {
  constructor(baseUrl) {
    this.baseUrl = baseUrl
  }
  //1.获取axios配置方法
  getInsideConfig() {
    console.log("baseUrl: ",this.baseUrl)
    const config = {
      //注意axios默认baseURL,URL必须大写
      baseURL: this.baseUrl,
      headers: {
        'Content-Type': 'application/json;charset=utf-8'
      },
      timeout: 20000 //超出10秒请求失败
    }
    return config
    
  }

  //2.配置拦截器
  interceptors(instance) {
    //请求拦截
    instance.interceptors.request.use(function (req) {
      console.log("全局请求发起：", req)
      return req
    }, function (error) {
      handleError(error)
      return Promise.reject(error)
    })

    //响应拦截
    instance.interceptors.response.use((res) => {
      //响应成功请求处理，返回resolve => res.data
      if (res.status === 200) {
        console.log("全局响应获取：", res)
        return Promise.resolve(res.data)
      } else {
        //失败返回reject，不响应到前端
        return Promise.reject(res)
      }
      return res
    }, (error) => {
      //定义异常函数
      handleError(error)
      return Promise.reject(error)
    })
  }

  //3.创建实例:创建axios的instance实例，可以传递config
  request(options) {
    const instance = axios.create()
    //对传入的options做整合
    const newOptions = Object.assign(this.getInsideConfig(), options)
    this.interceptors(instance)
    //这里的instance（== instance.requst）：可以接受一个axiosRequestConfig的变量
    return instance(newOptions)
  }

  //封装get
  get(url,config){
    console.log("url: ",url,"config: ",config);
    const options=Object.assign({
      method:'get',
      url:url
    },config)
    return this.request(options)
  }
  //封装post
  post(url,data){
    return this.request({
      method:'post',
      url:url,
      data:data
    })
  }
}



export default HttpRequest